home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu317.dms / pu317.adf / PUBLIC / BBS / BasicProgs / Morse / DXTest / DXTEST.BAS next >
BASIC Source File  |  1990-06-01  |  15KB  |  436 lines

  1. ' DXTEST.BAS version 1.2
  2. ' Copyright (© 1986,1987 by Clarke Greene K1JX NOT FOR COMMERCIAL USE)
  3. ' Amiga Version by John Gager K7KB
  4. '
  5. ' This Microsoft (tm) BASIC program will build a complete log package
  6. ' for the ARRL International DX Test.
  7. '
  8. ' The file containing the log entries must be an ASCII file in the
  9. ' following format: 
  10. '              (each band requires a separate log entry file)
  11. '
  12. ' TIME  CALLSIGN  RCV'D REPORT  (each log entry must be followed by
  13. '                                a carriage return)
  14. '
  15. ' At least one space must be between each field of each log entry. Only
  16. ' a changed digit in the TIME field must be present; for example, if the
  17. ' contest begins at 1800Z and the first contact is made at 1802Z and the
  18. ' second contact is made at 1805Z, then only 5 need be entered in the
  19. ' TIME field. If the third contact is made at 1812Z, then 12 should be
  20. ' entered in the TIME field. IF the next contact is made at 1812Z, then
  21. ' no number need be entered in the TIME field (however, be sure to enter
  22. ' a space to indicate separation between fields).
  23. '
  24. ' These files will be produced:
  25. '
  26. ' <filename>.LOG - this is a complete log ready for printing
  27. ' <filename>.DUP - this is a sorted duplicate listing ready for printing
  28. ' <filename>.SUM - this is a summary sheet ready for printing
  29. '
  30. '
  31. ' Depending on the version of BASIC for your particular machine, the CLS
  32. ' (Clear Screen) command must be changed.  Consult your own computer's
  33. ' BASIC documentation for more information.
  34. '
  35. ' If compiling (a VERY good idea for several orders of magnitude
  36. ' improvement in speed), use O and E switches. 
  37. '
  38. ' This program also uses a prefix library file (DXPREFIX.LIB), which MUST
  39. ' be on the same disc (and in the same subdirectory) as this program.
  40. '
  41. '
  42. WARNING$="Copyrighô (C© 1986,198· bù Clarkå Greenå K1JØ  NOÔ FOÒ COMMERCIAÌ USE"
  43. '
  44. CLEAR ,60000&:DEFINT a-Z : OPTION BASE 1
  45. DIM ENTRY$(1500), MULT$(175), PFX$(1000), CTRY$(1000), WIERDPFX$(50), WIERDCTRY$(50), AMBCTRY$(10), Q(175)
  46. BLANK$=" " : BL$="" : SLANT$="/" : TRUE=-1
  47. DUPE$="- Duplicate QSO -" : NEWCTRY$=" - Mult. #" : INVALID$="- Invalid QSO -"
  48. '
  49. '  Define format strings for printouts
  50. '
  51. LOGFORM$="   \      \  \  \    \            \   \   \    \    \    \                    \"
  52. DUPFORM$="     \          \   \          \   \          \   \          \   \          \"
  53. SUMFORM$="     \          \   \          \   \          \   \          \   \          \"
  54. '
  55. CLS
  56. COLOR 3 : PRINT TAB(27) "ARRL DX Test Log Processor" : COLOR 1 : PRINT : PRINT
  57. '
  58. '  Read Prefix table file
  59. '
  60. PRINT TAB(5)  "Reading prefix library...";
  61. I=0 ' initialize array subscript
  62. OPEN ":DXPREFIX.LIB" FOR INPUT AS #1
  63. WHILE NOT EOF(1)
  64.   I=I+1
  65.   INPUT #1, PFX$(I), CTRY$(I), DUMMY$, DUMMY$ ' DUMMY$ is a dummy
  66.                                               ' variable for unused data
  67. WEND
  68. CLOSE
  69. TABLESIZE=I ' prefix table length
  70. COLOR 3 : PRINT "Done" : COLOR 1
  71. '
  72. '  Get user input
  73. '
  74. PRINT : PRINT TAB(5) "What is the station callsign?  ";
  75. INPUT "", MYCALL$:MYCALL$=UCASE$(MYCALL$)
  76.  
  77. StateEntry:
  78.  
  79. PRINT : PRINT TAB(5) "What is the two letter abbreviation for the station's state?  ";
  80. INPUT "", MYSTATE$:MYSTATE$=UCASE$(MYSTATE$)
  81. IF LEN(MYSTATE$)<>2 THEN PRINT CHR$(7);: GOTO StateEntry
  82. PRINT : PRINT TAB(5) "What is the beginning date of the contest ";
  83. COLOR 3 : PRINT"<DD/MM/YY>? "; : COLOR 1
  84. INPUT "", STARTDATE$
  85. MARK=INSTR(STARTDATE$,"/") : IF MARK=0 THEN MARK=INSTR(STARTDATE$,"-")
  86. STARTDAY=VAL(LEFT$(STARTDATE$,MARK-1))
  87. STARTDATE$=RIGHT$(STARTDATE$,LEN(STARTDATE$)-MARK)
  88. MARK=INSTR(STARTDATE$,"/") : IF MARK=0 THEN MARK=INSTR(STARTDATE$,"-")
  89. MON=VAL(LEFT$(STARTDATE$,MARK-1))
  90. IF MON=2 THEN MON$=" Feb.  " : RST$="599" ELSE MON$=" Mar.  " : RST$="59"
  91. SENT$=RST$+MYSTATE$
  92. yr$=RIGHT$(STARTDATE$,LEN(STARTDATE$)-MARK)
  93. PRINT : PRINT TAB(5) "What is the GMT starting time for the contest?  ";
  94. INPUT "", STARTGMT$
  95.  
  96. GetLog:
  97.  
  98. PRINT : PRINT TAB(5) "What file is the log extract located in?  ";
  99. INPUT "", INFILE$ : GOSUB CheckForFile ' check to see if file is valid
  100. IF INSTR(INFILE$,".")<>0 THEN OUTFILE$=LEFT$(INFILE$,INSTR(INFILE$,".")-1) ELSE OUTFILE$=INFILE$
  101. PRINT : PRINT TAB(5) "What frequency band is the log extract for?  ";
  102. INPUT "", BAND$
  103. '
  104. CLS
  105. PRINT : PRINT TAB(5) "Duping and counting...";
  106. '
  107. '  Clear arrays
  108. '
  109. FOR I=1 TO 1500
  110.   ENTRY$(I)=BL$
  111. NEXT I
  112. FOR I=1 TO 175
  113.   MULT$(I)=BL$
  114.   Q(I)=1
  115. NEXT I
  116. '
  117. '  Initialize variables
  118. '
  119. RAWTOTAL=0 : QSOS=0 : DUPES=0 : INVALIDS=0 : MULTNR=0
  120. DAY=STARTDAY : PREVIOUSGMT$=STARTGMT$
  121. '
  122. '  Open files for data input and .LOG output
  123. '
  124. OPEN INFILE$ FOR INPUT AS #1 LEN=5000
  125. OPEN OUTFILE$+".LOG" FOR OUTPUT AS #2 LEN=5000
  126. '
  127. ' Collect log data, process, and enter into output file
  128. '
  129. WHILE NOT EOF(1)
  130.   LINE INPUT #1, THISENTRY$ ' read entire line from disc file
  131.   IF LEN(THISENTRY$)=0 THEN SkipEntry
  132.   WHILE ASC(RIGHT$(THISENTRY$,1))<48 AND LEN(THISENTRY$)>0
  133.     THISENTRY$=LEFT$(THISENTRY$,LEN(THISENTRY$)-1) ' strip off trailing
  134.                                                    ' spaces, etc.
  135.     WEND
  136.   IF LEN(THISENTRY$)>0 THEN RAWTOTAL=RAWTOTAL+1 ELSE GOTO SkipEntry
  137.   '
  138.   '  Separate received report from THISENTRY$
  139.   '
  140.   RCVD$=BL$ ' initialize RCVD$ to be null string
  141.   WHILE ASC(RIGHT$(THISENTRY$,1))>=48
  142.     RCVD$=RIGHT$(THISENTRY$,1)+RCVD$
  143.     THISENTRY$=LEFT$(THISENTRY$,LEN(THISENTRY$)-1) ' parse last character
  144.                                                    ' of string
  145.   WEND
  146.   IF LEN(RCVD$)<=3 THEN RCVD$=RST$+RCVD$ ' if signal report is left out,
  147.                                          ' append standard report
  148.   WHILE ASC(RIGHT$(THISENTRY$,1))<48
  149.     THISENTRY$=LEFT$(THISENTRY$,LEN(THISENTRY$)-1) ' strip off trailing
  150.                                                    ' spaces, etc.
  151.   WEND
  152.   '
  153.   ' Separate GMT from THISENTRY$
  154.   '
  155.   WHILE ASC(LEFT$(THISENTRY$,1))<48
  156.   THISENTRY$=RIGHT$(THISENTRY$,LEN(THISENTRY$)-1) ' strip off leading
  157.                                                   ' spaces
  158.   WEND
  159.   IF INSTR(THISENTRY$,BLANK$)<>0 THEN GMT$=LEFT$(THISENTRY$,INSTR(THISENTRY$,BLANK$)-1) ELSE GMT$=BL$
  160.   THISENTRY$=RIGHT$(THISENTRY$,(LEN(THISENTRY$)-LEN(GMT$)))
  161.   WHILE LEFT$(THISENTRY$,1)=BLANK$
  162.     THISENTRY$=RIGHT$(THISENTRY$,LEN(THISENTRY$)-1) ' strip off leading
  163.                                                     ' spaces
  164.   WEND
  165.   '
  166.   '  Fill in missing time data 
  167.   '
  168.   GMT$=LEFT$(PREVIOUSGMT$,(4-LEN(GMT$)))+GMT$
  169.   THEDATE$=BL$ : IF GMT$<PREVIOUSGMT$ THEN DAY=DAY+1 : THEDATE$=STR$(DAY)+MON$
  170.   '
  171.   '  Check for dupes
  172.   '
  173.   THISENTRY$=UCASE$(THISENTRY$)
  174.   DUPE.QSO=NOT TRUE : NOTE$=BL$ ' blank note
  175.   FOR I=1 TO QSOS
  176.     IF LEN(ENTRY$(I))<>LEN(THISENTRY$) GOTO NotDupe
  177.     IF THISENTRY$=ENTRY$(I) THEN NOTE$=DUPE$ : DUPES=DUPES+1 : DUPE.QSO=TRUE : I=QSOS
  178.   NotDupe: NEXT I
  179.   IF DUPE.QSO GOTO WriteEntry ' skip over prefix search if
  180.                               ' this entry is a dupe.
  181.   QSOS=QSOS+1 : ENTRY$(QSOS)=THISENTRY$
  182.   '
  183.   '  Determine prefix and search prefix library for contact country
  184.   '
  185.   IF INSTR(THISENTRY$,SLANT$)>0 THEN GOSUB GetPortPrefix ELSE THISPFX$=LEFT$(THISENTRY$,4)
  186.   GOSUB SearchPrefix : IF NOT INLIST THEN GOSUB SearchWierd
  187.   IF THISCTRY$="W" OR THISCTRY$="VE" THEN NOTE$=INVALID$ : INVALIDS=INVALIDS+1 : GOTO WriteEntry
  188.   IF ASC(THISCTRY$)<48 THEN GOSUB ResolvePrefix ' resolve ambiguous
  189.                                                 ' prefix
  190.   '
  191.   '  Search multiplier table for new multiplier
  192.   '
  193.   NEWMULT=TRUE ' initially call contact a new multiplier
  194.   FOR I=1 TO MULTNR
  195.     IF MULT$(I)=THISCTRY$ THEN Q(I)=Q(I)+1 : NEWMULT=NOT TRUE : I=MULTNR
  196.   NEXT I
  197.   IF NEWMULT THEN MULTNR=MULTNR+1 : MULT$(MULTNR)=THISCTRY$ : NOTE$=THISCTRY$+NEWCTRY$+STR$(MULTNR)
  198.   '
  199.   '  Write entry to file  
  200.   '
  201.   WriteEntry:
  202.   
  203.   IF (RAWTOTAL-1) MOD 50=0 THEN GOSUB PrintHeader ' print header if this
  204.                                                   ' is the beginning of
  205.                                                   ' a page
  206.   PRINT #2, USING LOGFORM$; THEDATE$; GMT$; THISENTRY$; SENT$; RCVD$; NOTE$
  207.   IF RAWTOTAL MOD 50=0 THEN PRINT #2, CHR$(12) 'print a form feed if
  208.                                                'this is the end of a page
  209.   '
  210.   '  Reset variables for next entry
  211.   '
  212.   PREVIOUSGMT$=GMT$ : GMT$=BL$
  213. SkipEntry:
  214. WEND
  215. IF RAWTOTAL MOD 50<>0 THEN PRINT #2, CHR$(12) ' if a form feed hasn't
  216.                                               ' been printed, print one
  217. CLOSE
  218. COLOR 3 : PRINT "Done" : COLOR 1
  219. '
  220. '  Build dupe sheet
  221. '
  222. PRINT : PRINT TAB(5) "Preparing dupe sheet...";
  223. '
  224. '  Sort callsigns for dupe sheet
  225. '
  226. M=QSOS\2
  227. WHILE M>0
  228.   FOR I=M+1 TO QSOS
  229.     J=I-M
  230.     WHILE J>0
  231.       IF ENTRY$(J)>ENTRY$(J+M) THEN SWAP ENTRY$(J),ENTRY$(J+M) : J=J-M ELSE J=0
  232.     WEND
  233.   NEXT I
  234.   M=M\2
  235. WEND
  236. '
  237. '  Enter dupe sheet into file
  238. '
  239. OPEN OUTFILE$+".DUP" FOR OUTPUT AS #1
  240. IF QSOS MOD 250=0 THEN LASTPAGE=QSOS\250 ELSE LASTPAGE=QSOS\250+1
  241. FOR PAGE=1 TO LASTPAGE
  242.   PRINT #1, SPC(20-(LEN(MYCALL$)+LEN(BAND$))/2); MYCALL$; " -- Dupe Sheet for ";
  243.   PRINT #1, BAND$; " MHz Band -- Page"; STR$(PAGE)
  244.   PRINT #1, BL$ : PRINT #1, BL$
  245.   FOR ROW=1 TO 50
  246.     E=(PAGE-1)*250+ROW
  247.     PRINT #1, USING DUPFORM$; ENTRY$(E); ENTRY$(E+50); ENTRY$(E+100); ENTRY$(E+150); ENTRY$(E+200)
  248.   NEXT ROW
  249.   PRINT #1, CHR$(12) ' go to next page
  250. NEXT PAGE
  251. CLOSE
  252. COLOR 3 : PRINT "Done" : COLOR 1
  253. '
  254. '  Build summary listing
  255. '
  256. PRINT : PRINT TAB(5) "Preparing summary sheet...";
  257. '
  258. '  Sort multipliers for summary sheet
  259. '
  260. M=MULTNR\2
  261. WHILE M>0
  262.   FOR I=M+1 TO MULTNR
  263.     J=I-M
  264.     WHILE J>0
  265.       IF MULT$(J)>MULT$(J+M) THEN SWAP MULT$(J),MULT$(J+M) : SWAP Q(J),Q(J+M) : J=J-M ELSE J=0
  266.     WEND
  267.   NEXT I
  268.   M=M\2
  269. WEND
  270. '
  271. '  Append number of qsos per country onto country prefixes
  272. '
  273. FOR I=1 TO MULTNR
  274.   MULT$(I)=MULT$(I)+SPACE$(6-LEN(MULT$(I)))+" -"+STR$(Q(I))
  275. NEXT I
  276. '
  277. '  Enter summary sheet into file
  278. '
  279. OPEN OUTFILE$+".SUM" FOR OUTPUT AS #1
  280. PRINT #1, SPC(14-(LEN(MYCALL$)+LEN(BAND$))/2); MYCALL$; " -- Summary Sheet for "; BAND$;
  281. PRINT #1, " MHz Band - "; yr$; " ARRL DX Test" 
  282. PRINT #1, BL$
  283. PRINT #1, TAB(15); "Country Listing and number of contacts per Country"
  284. PRINT #1, BL$ : PRINT #1, BL$
  285. IF MULTNR MOD 5=0 THEN LASTROW=MULTNR\5 ELSE LASTROW=MULTNR\5+1
  286. FOR ROW=1 TO LASTROW
  287.   PRINT #1, USING SUMFORM$; MULT$(ROW); MULT$(ROW+LASTROW); MULT$(ROW+LASTROW*2); MULT$(ROW+LASTROW*3); MULT$(ROW+LASTROW*4)
  288. NEXT ROW
  289. PRINT #1, BL$ : PRINT #1, BL$ : PRINT #1, BL$
  290. PRINT #1, TAB(18) "Total Valid QSOs - "; STR$(QSOS-INVALIDS); TAB(45)"Dupes - "; STR$(DUPES)
  291. PRINT #1, TAB(18) "Countries - "; STR$(MULTNR)
  292. CLOSE
  293. COLOR 3 : PRINT "Done" : COLOR 1
  294. '
  295. '  Print results
  296. '
  297. CLS : PRINT CHR$(7)
  298. PRINT : PRINT TAB(5) "Results for the "; BAND$; " MHz band" 
  299. PRINT : PRINT TAB(8) "Valid QSOs:";
  300. COLOR 3 : PRINT USING"    ####"; QSOS-INVALIDS : COLOR 1
  301. PRINT TAB(8) "Duplicate QSOs:";
  302. COLOR 3 : PRINT USING" ###"; DUPES : COLOR 1
  303. PRINT TAB(8) "Countries:";
  304. COLOR 3 : PRINT USING"      ###"; MULTNR : COLOR 1
  305. PRINT : PRINT : PRINT 
  306. PRINT TAB(5) "Type "; : COLOR 3 : PRINT"C "; : COLOR 1 
  307. PRINT"to continue with another band,"
  308. PRINT TAB(5) "or any other key to Exit   ";
  309. ANS$=INPUT$(1)
  310. IF UCASE$(ANS$)="C" THEN CLS : GOTO GetLog ELSE CLS : END
  311.  
  312. '
  313. '  Subroutine to trap missing file
  314. '
  315. CheckForFile:
  316.  
  317. ON ERROR GOTO NoFile
  318. OPEN INFILE$ FOR INPUT AS #1 ' try opening file
  319. ON ERROR GOTO 0
  320. CLOSE
  321. RETURN
  322.  
  323. NoFile:
  324.  
  325. PRINT CHR$(7) : PRINT TAB(4) "That file does not exist - type X to Exit or any other key to continue ";
  326. ANS$=INPUT$(1) : IF UCASE$(ANS$)="X" THEN CLS : END
  327. PRINT 
  328. RESUME GetLog
  329. '
  330. '  Subroutine to determine prefix from portable designator
  331. '
  332. GetPortPrefix:
  333.  
  334. MARK=INSTR(THISENTRY$,SLANT$)
  335. IF MARK>3 THEN THISPFX$=RIGHT$(THISENTRY$,LEN(THISENTRY$)-MARK) ELSE THISPFX$=LEFT$(THISENTRY$,MARK-1)
  336. IF LEN(THISPFX$)>1 GOTO PfxReturn ' have prefix - return
  337. IF ASC(THISPFX$)>58 OR ASC(THISPFX$)<47 THEN THISPFX$=LEFT$(THISENTRY$,4) : GOTO PfxRetrun ' (local portable designator)
  338. K=2 ' find position of first numeral in call
  339. WHILE (ASC(MID$(THISENTRY$,K,1))>57 OR ASC(MID$(THISENTRY$,K,1))<48) AND K<LEN(THISENTRY$)
  340.   K=K+1
  341. WEND
  342. THISPFX$=LEFT$(THISENTRY$,K-1)+THISPFX$ ' new prefix = portable number
  343.                                         ' in old prefix
  344. PfxReturn: RETURN
  345. '
  346. '  Subroutine to search prefix library for standard country prefix
  347. '
  348. SearchPrefix:
  349.  
  350. K=4 : INLIST=NOT TRUE : SAVEDPFX$=THISPFX$
  351. WHILE K>0 AND INLIST=NOT TRUE
  352.   THISPFX$=LEFT$(THISPFX$,K)
  353.   LOW=1 : HIGH=TABLESIZE : INLIST=NOT TRUE ' initial values for binary
  354.                                            ' sort
  355.   WHILE LOW<=HIGH AND INLIST=NOT TRUE
  356.     L=(LOW+HIGH)\2
  357.     IF THISPFX$=PFX$(L) THEN INLIST=TRUE : THISCTRY$=CTRY$(L)
  358.     IF THISPFX$<PFX$(L) THEN HIGH=L-1 ELSE LOW=L+1
  359.   WEND
  360.   K=K-1
  361. WEND
  362. RETURN
  363. '
  364. '  Subroutine to search unusual prefix list
  365. '
  366. SearchWierd:
  367.  
  368. IF NRWIERDPFX=0 GOTO GetPrefix ' if the supplementary prefix list is
  369.                                ' empty, skip ahead.
  370. K=4
  371. WHILE K>0
  372.   SAVEDPFX$=LEFT$(SAVEDPFX$,K)
  373.   FOR J=1 TO NRWIERDPFX
  374.     IF SAVEDPFX$=WIERDPFX$(J) THEN INLIST=TRUE : THISCTRY$=WIERDCTRY$(J) : J=NRWIERDPFX : K=1
  375.   NEXT J
  376.   K=K-1
  377. WEND
  378. IF INLIST THEN RETURN ' if the prefix was found, return
  379. '
  380. '  Routine to get prefix definition and continent
  381. '  from user for prefix not found in library.
  382. '
  383. GetPrefix:
  384.  
  385. CLS : PRINT CHR$(7) : PRINT
  386. PRINT TAB(5) "The prefix for "; : COLOR 3 : PRINT THISENTRY$; : COLOR 1
  387. PRINT " can't be found in the prefix library."
  388. PRINT : PRINT TAB(8) "What is the callsign prefix?  "; 
  389. INPUT "", HELDPFX$ : HELDPFX$=UCASE$(HELDPFX$)
  390. PRINT : PRINT TAB(8) "What standard prefix is that equivalent to?  ";
  391. INPUT "", THISPFX$ : THISPFX$=UCASE$(THISPFX$)
  392. GOSUB SearchPrefix : IF NOT INLIST GOTO GetPrefix
  393. NRWIERDPFX=NRWIERDPFX+1 : WIERDPFX$(NRWIERDPFX)=HELDPFX$ : WIERDCTRY$(NRWIERDPFX)=THISCTRY$
  394. CLS : PRINT : PRINT TAB(5) "Back to duping and counting...";
  395. RETURN
  396. '
  397. '  Subroutine to resolve ambiguous prefix with user interaction
  398. '
  399. ResolvePrefix:
  400.  
  401. THISCTRY$=RIGHT$(THISCTRY$,LEN(THISCTRY$)-1) ' strip initial delimiter
  402. J=0
  403. WHILE LEN(THISCTRY$)>0
  404.   J=J+1
  405.   MARK=INSTR(THISCTRY$,".")
  406.   AMBCTRY$(J)=LEFT$(THISCTRY$,MARK-1) ' put multipiler name into array
  407.   THISCTRY$=RIGHT$(THISCTRY$,LEN(THISCTRY$)-MARK)
  408. WEND
  409. CLS : PRINT CHR$(7) : PRINT
  410. PRINT TAB(5) "The prefix for "; : COLOR 3 : PRINT THISENTRY$; : COLOR 1
  411. PRINT " could indicate several different countries."
  412. PRINT : PRINT TAB(8) "The possiblities are:" : COLOR 3 : PRINT
  413. FOR K=1 TO J
  414.   PRINT TAB(11) STR$(K); ". "; AMBCTRY$(K) ' print choices to screen
  415. NEXT K
  416. COLOR 1
  417. EnterCntry:
  418. PRINT : PRINT TAB(8) "Type the number of the correct country. > ";
  419. INPUT "", CHOICE$
  420. K=VAL(CHOICE$) : IF K > J OR K < 1 THEN PRINT CHR$(7); : GOTO EnterCntry
  421. THISCTRY$=AMBCTRY$(K)
  422. CLS : PRINT : PRINT TAB(5) "Back to duping and counting...";
  423. RETURN
  424. '
  425. '  Subroutine to print log sheet header
  426. '
  427. PrintHeader:
  428.  
  429. PRINT #2, BL$
  430. PRINT #2, TAB(5); MYCALL$; "  "; BAND$; " MHz Log"; TAB(70); "Page"; STR$(RAWTOTAL\50+1)
  431. PRINT #2, BL$
  432. PRINT #2, "     Date    Time    Callsign         Sent     Rcv'd           Notes"  
  433. PRINT #2, "   "; STRING$(74,61)
  434. THEDATE$=STR$(DAY)+MON$
  435. RETURN 
  436.